package com.example.util;

import lombok.extern.slf4j.Slf4j;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

/**平常 常用 工具类
 *
 * @email: pengyujun53@163.com
 * @author: peng_YuJun
 * @date: 2022/9/18
 * @time: 21:40
 */
@Slf4j
public class CommonUtil {

    /**
     * 将Date类型 转换成 yyyy-MM-dd hh:mm:ss字符串形式
     *
     * @return
     */
    public static String DateToString(Date dateTime){
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            String strTime = formatter.format(dateTime);
            return strTime;
        } catch (Exception e) {
            log.error("时间转字符串错误");
            return null;
        }
    }


    /**
     * 将yyyy-MM-dd hh:mm:ss字符串形式 转换成Date类型
     *
     * @return
     */
    public static Date StringToDate(String strTime){
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            Date dateTime = formatter.parse(strTime);
            return dateTime;
        } catch (Exception e) {
            log.error("字符串转时间错误");
            return null;
        }
    }

    /**
     * Object List 转 T List
     * @param obj
     * @param cla
     * @param <T>
     * @return
     */
    public static <T> List<T> objToList(Object obj, Class<T> cla) {
        List<T> list = new ArrayList<T>();
        if (obj instanceof ArrayList<?>) {
            for (Object o : (List<?>) obj) {
                list.add(cla.cast(o));
            }
            return list;
        }
        return null;
    }

    //将一个list平均分成n份
    public static <T>List<List<T>> averageAssign(List<T> orginList, int n){
        List<List<T>> results = new ArrayList<>();
        int remainder = orginList.size() % n;
        int number = orginList.size()/n;
        int offset = 0;
        for(int i=0;i<n;i++){
            List<T> value = null;
            if (remainder>0) {
                value = orginList.subList(i*number+offset, (i+1)*number+offset+1);
                remainder--;
                offset++;
            }else{
                value = orginList.subList(i*number+offset, (i+1)*number+offset);
            }
            results.add(value);
        }
        return results;
    }

    /**
     * 列表分批处理
     * @param dataList 列表
     * @param batchSize 每一批处理的数量
     * @param consumer 处理的操作，可以通过匿名函数传入
     * @param <T>
     */
    public static <T> void batchProcessList(List<T> dataList, int batchSize, Consumer<List<T>> consumer) {
        //dataList.stream()
        //        .collect(Collectors.groupingBy(i -> dataList.indexOf(i) / batchSize))
        //        .forEach((k, v) -> consumer.accept(v));
        IntStream.range(0, dataList.size())
                .boxed()
                .collect(Collectors.groupingBy(index -> index / batchSize))
                .values()
                .forEach(indices -> {
                    List<T> batchList = indices.stream()
                            .map(dataList::get)
                            .collect(Collectors.toList());
                    consumer.accept(batchList);
                });
    }
}
